$OpenBSD: patch-xbreaky_snd_c,v 1.2 2010/01/07 09:38:20 jakemsr Exp $
--- xbreaky.snd.c.orig	Thu May 11 01:13:45 2000
+++ xbreaky.snd.c	Sun Jan  3 01:15:56 2010
@@ -20,24 +20,23 @@
  */
 
 #include <stdio.h>
-#include <malloc.h>
 #include <unistd.h>
 #include <stdlib.h>
-#include <getopt.h>
 #include <fcntl.h>
 #include <string.h>
 #include <strings.h>
 #include <signal.h>
-#include <sys/soundcard.h>
-#include <sys/ioctl.h>
+#include <sndio.h>
 
 #define DEFAULT_DSP_SPEED 8000
-#define AUDIO "/dev/dsp"
-#define RAWFILESDIR PREFIX"/share/games/xbreaky"
 
+#define RAWFILESDIR PREFIX"/share/xbreaky"
+
 int timelimit = 0, dsp_speed = DEFAULT_DSP_SPEED, dsp_stereo = 0;
 int samplesize = 8;
-int audio, abuf_size;
+int abuf_size;
+struct sio_hdl *hdl;
+struct sio_par par;
 char *audiobuf, c;
 char *names[]={ RAWFILESDIR"/catch.raw",
                 RAWFILESDIR"/fire.raw"  };
@@ -48,43 +47,42 @@ void quit ();
 
 int main (int argc, char *argv[])
 { 
-  int tmp;
   int i;
   char k;
 
   signal(SIGTERM, quit);   
-  fcntl(STDIN_FILENO,F_SETFL,O_NONBLOCK);
-  audio = open (AUDIO, O_WRONLY, 0);
-  if (audio == -1)
+  hdl = sio_open (NULL, SIO_PLAY, 0);
+  if (hdl == NULL)
   {
-   perror (AUDIO);
+   fprintf(stderr, "sio_open failed\n");
    exit (-1);
   }
 
-  tmp = samplesize;
-  ioctl(audio, SNDCTL_DSP_SAMPLESIZE, &samplesize);
-  if (tmp != samplesize)
-  {
-   fprintf(stderr, "xbreaky.snd: Unable to set the sample size\n");
+  sio_initpar(&par);
+  par.bits = samplesize;
+  par.sig = samplesize == 8 ? 0 : 1;
+  par.pchan = dsp_stereo ? 2 : 1;
+  par.rate = dsp_speed;
+  par.le = SIO_LE_NATIVE;
+
+  if (!sio_setpar(hdl, &par) || !sio_getpar(hdl, &par)) {
+   fprintf(stderr, "xbreaky.snd: Unable to set audio parameters.\n");
    exit(-1);
   }
 
-  if (ioctl (audio, SNDCTL_DSP_STEREO, &dsp_stereo)==-1)
-  {
-   fprintf (stderr, "xbreaky.snd: Unable to set mono/stereo\n");
-   perror (AUDIO);
-   exit (-1);
+  if (par.bits != samplesize || par.sig != (samplesize == 8 ? 0 : 1) ||
+      par.pchan != (dsp_stereo ? 2 : 1) || par.rate != dsp_speed) {
+   fprintf(stderr, "xbreaky.snd: Unable to set audio parameters as desired.\n");
+   exit(-1);
   }
 
-  if (ioctl (audio, SNDCTL_DSP_SPEED, &dsp_speed) == -1)
-  {
-   fprintf (stderr, "xbreaky.snd: Unable to set audio speed\n");
-   perror (AUDIO);
-   exit (-1);
+  if (!sio_start(hdl)) {
+   fprintf(stderr, "xbreaky.snd: Unable to start audio.\n");
+   exit(-1);
   }
+
+  abuf_size = par.round * par.bps * par.pchan;
   
-  ioctl (audio, SNDCTL_DSP_GETBLKSIZE, &abuf_size);
-  
   if ((audiobuf = malloc (abuf_size)) == NULL)
   {
    fprintf (stderr, "Unable to allocate input/output buffer\n");
@@ -101,11 +99,11 @@ int main (int argc, char *argv[])
    }
    if(i!=-1)  
    { 
-    play(names[(int)k]);
+    play(names[(int)k & 1]);
    }
   }    
 
-  close (audio);
+  sio_close (hdl);
   return 0;
 }
 
@@ -134,9 +132,9 @@ void play (char *name)
    if (c > abuf_size) c = abuf_size;
    if ((l = read (fd, audiobuf, c)) > 0)
    {
-    if (write (audio, audiobuf, l) != l)
+    if (sio_write (hdl, audiobuf, l) != l)
     {
-     perror (AUDIO);
+     fprintf(stderr, "sio_write failed\n");
      exit (-1);
     }
     count -= l;
